// TODO：复习 3-25
// 方法一， 递归
const arr = [1, [2, 3, 4, 5], 6]


function flat(arr) {
    // 这里保存的res用来保存每次返回的结果数据
    let res = []

    function F(arr, res) {
        for (let item of arr) {
            if (Array.isArray(item)) {
                F(item, res)
            } else {
                res.push(item)
            }
        }
        return res;
    }

    return F(arr, res)
}

console.log(flat(arr));


// 方法二： Es6新特性
function fn(arr) {
    let res = []
    // forEach没有返回值的
    return arr.forEach(item => Array.isArray(item) ? fn(item) : res.push(item))
    // forMap有返回值的
}


function row(arr) {
    // Array.flat方法参数是拍平的深度
    return arr.flat(Infinity)
}

// console.log(row(arr));

// toString  方法
function F(arr) {
    return arr.toString().split(',').map((val) => {
        return parseInt(val)
    });
}


// console.log(F(arr))
const arr1 = [1, [2, 3, 4, 5], [7, 8, 9, 10,], 6]
// console.log(arr1.toString().split(',').forEach(item => parseInt(item)));
// console.log(arr1)

// console.log(arr1.toString().split(',').map(item => parseInt(item)))


function flatV2(arr) {
    let res = []

    function F() {
        for (let item of arr) {
            if (Array.isArray(item)) {
                flatV2(item)
            } else {
                res.push(item)
            }
        }
        return res
    }
    F()
}


function split(arr, spliter) {
    let res = []
    for(let i=0; i<arr.length;){
        res.push(i, i+=spliter)
    }
    return res;
}


// 方法三： 使用toString方法
function  flatV3(arr){
    return arr.toString().split(',').map(item => parseInt(item))
}

console.log(flatV3(arr1));


function flatV4(arr, dept = 10) {
  if (dept === 0) return arr;
  return arr.reduce((pre, cur) =>
    Array.isArray(cur) ? [...pre, ...flatV4(cur, dept - 1)] : [pre, cur]
  );
}

// console.log(flatV4([1, 2, 3, 4, [3, 4, 5, [30, 39, 90], 20]]));



function flatV5(arr) {
  let res = [];

  arr.forEach((item) => {
    if (Array.isArray(item)) {
      res = [...res, ...flatV5(item)];
    } else {
      res.push(item);
    }
  });
  return res;
}

console.log("xxx", flatV5([1, 2, 3, 4, [3, 4, 5, [30, 39, 90], 20]]));

function snakeCase(input) {
  return input.replace(/\s+[A-Z]/g, (letter) => {
    console.log(letter), "_" + letter.trim().toLowerCase();
  });
}

console.log(snakeCase("Foo Bar"));
